#include <fstream>
#include <string>
#include <map>
#include <sstream>
#include <vector>
#include <algorithm>
#include "utils.h"
#include <iostream>
#include "time.h"

using namespace std;

void escribirArchivo(string nombre, std::multimap<string,string> &bigrams, std::map<pair<string,string>,int> &counts) {

	std::ostringstream fn;
	fn << nombre;

	ofstream ficheroSalida;
	ficheroSalida.open(fn.str().c_str());

	for (std::multimap<string,string>::iterator iterador=bigrams.begin(); iterador!=bigrams.end(); ++iterador) {
		string token = iterador->first;
		string token2 = iterador->second;
	    ficheroSalida <<  token << "|" << token2 << "|" << counts[make_pair(token,token2)] << '\n';
	}

	bigrams.clear();
	counts.clear();
	ficheroSalida.close();
}

void escribirArchivo(string nombre, std::map<std::string,int> &unigrams) {

	std::ostringstream fn;
	fn << nombre;

	ofstream ficheroSalida;
	ficheroSalida.open(fn.str().c_str());

	for (std::map<std::string,int>::iterator iterador=unigrams.begin(); iterador!=unigrams.end(); ++iterador) {
		string token = iterador->first;
		int count = iterador->second;
	    ficheroSalida <<  token << "|" << count << '\n';
	}

	unigrams.clear();
	ficheroSalida.close();
}

bool containsLetterOrNumber(std::string str) {
	std::locale loc;
	for (std::string::iterator it=str.begin(); it!=str.end(); ++it) {
		if (std::isalpha(*it,loc) || std::isdigit(*it))
			return true;
	}
	return false;
}

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}

std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}

int buscarComillasSueltas(string &linea){
	const string comillas = "\"\"";
	std::string separador = " ";
	const string coma = ",";
	std::vector<string> lista = split(linea, ' ');
	std::vector<std::string>::iterator it;

	int cont = std::count(lista.begin(),lista.end(),comillas);

	// Si hay un par de comillas dobles sueltas, retorno la posici�n en donde agregar el resto
	if (cont == 1) {

		// Si hay una coma, retorno esa posici�n
		int pos = ci_find(linea, coma + separador);
		if ((pos >= 0) && (ci_find(linea, coma + separador + comillas) < 0))
			return (pos + 2);

		// Si no hay coma, genero un n�mero random
		// Busco la posici�n de ese elemento en la l�nea, y retorno el espacio vac�o siguiente
		int random = 1;
		unsigned elementos = lista.size()-1; // Quito el primer y el �ltimo elemento
		srand(clock());
		if (elementos != 0) {
			if (lista[1] == comillas)
				random = rand() % elementos +2; //si el primer elemento es comillas, comillas no puede ser el segundo
			else
				random = rand() % elementos +1;
		}

		it = lista.begin();
		std::advance(it, random);
		pos = ci_find(linea, *it + separador ) + (*it).length();

		return (pos + 1);
	}

	return -1;
}
